#include <iostream>
using std::cout;
using std::endl;

int func1(){
    int num = 100;
    return num;//发生复制
}

int gNum = 10;
int func2(){
    return gNum;//发生复制
}

int & func3(){
    return gNum;//创建一个匿名的引用绑定gNum，没有发生复制
}

//不要返回一个局部变量的引用
//
//如果使用引用作为函数的返回值
//要确保引用所绑定的变量本体生命周期比函数更长
/* int & func4(){ */
/*     int num = 23; */
/*     return num; */
/* } */


void test0(){
    //func1的返回值是局部变量num的副本
    cout << func1() << endl;
    /* &func1(); */

    //func2的返回值是全局变量gNum的副本(也是一个临时变量)
    cout << func2() << endl;
    /* &func2(); */

    cout << func3() << endl;
    cout << &func3() << endl;
    cout << &gNum << endl;

    int & ref = func3();
    cout << &ref << endl;


    /* int a = 1, b = 2; */
    /* &(a + b); */
}

int & func4(){
    int * p = new int(24);
    /* cout << p << endl; */
    return *p;
}

void test1(){
    /* cout << &func4() << endl; */
    /* cout << func4() + 20 << endl; */
    /* delete &func4(); */

    int & ref = func4();
    cout << ref << endl;
    ref += 10;
    cout << ref << endl;
    delete &ref;
}


int main(void){
    test1();
    return 0;
}
